package banking;

import banking.domain.OverdraftException;

/**
 * @author: 韩学伟
 * @date: 2024/12/22 21:48
 * @描述:帐户类Account的子类 支票账户
 * @版本: v1.0
 *
 * */
// CheckingAccount 类必须扩展 Account 类
    // .该类必须包括一个关联属性，称作 protectedBy，表示透支保护。该属性的
//类型为 SavingAccount，缺省值必须是 null。除此之外该类没有其他的数据属
//性。

public class CheckingAccount extends Account {
    // 2． 该类必须包含一个类型为 double 的 overdraftProtection 属性。
    //该类必须包括一个关联属性，称作 protectedBy，表示透支保护。该属性的类型为 SavingAccountt，缺省值必须是 null。
    private SavingAccount protectedBy;
    /**
     * @描述：透支额
     * */
    private double overdraftProtection; // 透支额
    // 4． 给类必须包括另一个带有两个参数（balance 和 protect）的公有构造器。该
    //构造器必须通过调用 super(balance)并设置 overdragtProtection 属性，
    //将 balance 参数传递给父类构造器。
    public CheckingAccount(double init_balance, double overdraftProtection,SavingAccount protectedBy) {
        super(init_balance);
        this.overdraftProtection = overdraftProtection;
        // protectedBy缺省值为null
        this.protectedBy = protectedBy;

    }
    //3． 该类必须包含一个带有参数（balance）的共有构造器。该构造器必须通过调
    //用 super(balance)将 balance 参数传递给父类构造器。
    public CheckingAccount(double init_balance) {
        super(init_balance);
    }

    //5． CheckingAccount 类必须覆盖 withdraw 方法。
    // 此方法必须执行下列检查。
    // 如 果当前余额足够弥补取款 amount,则正常进行。
    @Override
    public boolean withdraw(double amt) {
        if (getBalance() >= amt) {
            super.withdraw(amt);
            return true;
        }
        // 如果不够弥补但是存在透支 保护，
        // 则尝试用 overdraftProtection 得值来弥补该差值（balance-amount）.
        // 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败，但余 额未受影响。
        else if (amt - getBalance() <= overdraftProtection) {
            overdraftProtection -= (amt - getBalance());
            setBalance(0);
            return true;
        }
        return false;
    }
    // 重写 withdraw 方法使它不返回值（即 void）.声明方法抛出
    //overdraftException
    //异常
    //7． 修改代码使其在需要时抛出异常。两种情况要处理：第一是存在没有透支保
    // 尚硅谷 Java 基础实战—Bank 项目
    //护的赤字，对这个异常使用 “no overdraft protection”信息。第二是
    //overdraftProtection 数 额 不 足 以 弥 补 赤 字 ： 对 这 个 异 常 可 使
    //用 ”Insufficient funds for overdraft protection” 信息
//    public void withdraw(double amt) throws OverdraftException {
//        if (getBalance() >= amt) {
//            super.withdraw(amt);
//        }
//        else if (amt - getBalance() <= overdraftProtection) {
//            overdraftProtection -= (amt - getBalance());
//            setBalance(0);
//        } else {
//            throw new OverdraftException("Insufficient funds for overdraft protection", amt - getBalance());
//        }
//    }



    // 该类必须包括一个带有参数（balance）的公有构造器，该构造器必须通过调
    //用 super(balance)将 balance 参数传递到父类构造器。
    public CheckingAccount(double init_balance, double overdraftProtection) {
        super(init_balance);
        this.overdraftProtection = overdraftProtection;
    }
    // 修 改 构 造 器 为 CheckingAccount(double balance,SavingAccount
    //protect)构造器。该构造器必须通过调用 super（balance）将 balance 参数
    //传递给父类构造器。
    public CheckingAccount(double init_balance, SavingAccount protectedBy) {
        super(init_balance);
        this.protectedBy = protectedBy;
    }
}